package br.com.gesclub.business.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;

import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.Type;

import br.com.gesclub.enums.EventoSituacaoEnum;

@Entity
@Table(name = "EVENTO")
public class Evento extends BaseEntity {

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "CD_EVENTO", unique = true, updatable = false, nullable = false)
	private Long id;
	
	@Column(name = "NM_EVENTO", nullable = false)
	private String nome;
	
	@Column(name = "NR_VAGAS", nullable = false)
	private Integer numeroVagas;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DT_INICIO", nullable = false)
	private Date dataInicial;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DT_FIM", nullable = false)
	private Date dataFinal ;
	
	@Column(name = "DS_DESCRICAO", nullable = false)
	private String descricao;
	
	@Column(name = "IN_SITUACAO", nullable = false)
	@Type(type = "br.com.gesclub.business.dao.util.GenericEnumUserType",
		parameters = {
		@Parameter (name = "enumClass", value = "br.com.gesclub.enums.EventoSituacaoEnum"),
		@Parameter (name = "identifierMethod", value = "getCodigo"),
		@Parameter (name = "valueOfMethod", value = "from")
	})
	private EventoSituacaoEnum situacao;
	
	@Version
	@Column(name = "NR_VERSAO", nullable = false)
	private Long versao;
	
	// Relacionamentos
	@ManyToOne
	@JoinColumn(name = "TIPO_EVENTO_CD_TIPOEVENTO", nullable = false)
	private TipoEvento tipoEvento;
	
	@ManyToOne
	@JoinColumn(name = "LOCAL_EVENTO_CD_LOCAL_EVENTO", nullable = false)
	private LocalEvento localEvento;
	
	@Override
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public boolean isDatasValidas() {	
		return (dataInicial != null && dataFinal != null) && (dataInicial.before(dataFinal));
	}
	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public EventoSituacaoEnum getSituacao() {
		return situacao;
	}
	public void setSituacao(EventoSituacaoEnum situacao) {
		this.situacao = situacao;
	}
	
	public Integer getNumeroVagas() {
		return numeroVagas;
	}
	public void setNumeroVagas(Integer numeroVagas) {
		this.numeroVagas = numeroVagas;
	}
	
	public Date getDataInicial() {
		return dataInicial;
	}
	public void setDataInicial(Date dataInicial) {
		this.dataInicial = dataInicial;
	}
	
	public Date getDataFinal() {
		return dataFinal;
	}
	public void setDataFinal(Date dataFinal) {
		this.dataFinal = dataFinal;
	}
	
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Long getVersao() {
		return versao;
	}

	public void setVersao(Long versao) {
		this.versao = versao;
	}

	public TipoEvento getTipoEvento() {
		return tipoEvento;
	}

	public void setTipoEvento(TipoEvento tipoEvento) {
		this.tipoEvento = tipoEvento;
	}

	public LocalEvento getLocalEvento() {
		return localEvento;
	}

	public void setLocalEvento(LocalEvento localEvento) {
		this.localEvento = localEvento;
	}
	
}